Skip to main content
Version: 1.0.0

四、应用案例讲解:yolov5_tracker_sample

本节将基于 yolov5_tracker_sample 案例,解析其内部实现,帮助用户理解 TacoAI 应用开发的核心流程。

4.1 程序流程概览

该示例整合了 TACO SDK 的主要模块,实现了一个完整的 AI 处理链路:

yolov5_tracker_sample

4.2 核心 API 解析

以下是实现上述流程的关键代码片段和 API 解析。

4.2.1 加载模型

使用 ta_runtime_load_model_from_file 函数从 .nb 文件加载预编译的 AI 模型到 NPU。

// 最后一个参数 0 表示使用 NPU 的第一个核心
int status = ta_runtime_load_model_from_file(&m_nnrt_context, file_path.c_str(), 0);

4.2.2 硬件加速解码

通过 avcodec_find_decoder_by_name 指定使用硬件加速解码器 (h264_tacohevc_taco)。

if (video_stream->codecpar->codec_id == AV_CODEC_ID_H264) {
codec = avcodec_find_decoder_by_name("h264_taco");
}
if (video_stream->codecpar->codec_id == AV_CODEC_ID_HEVC) {
codec = avcodec_find_decoder_by_name("hevc_taco");
}

4.2.3 图像尺寸调整 (Resize)

调用 ta_cv_image_resize 接口,使用硬件对解码后的图像进行高效缩放,以满足模型输入尺寸要求。

ta_cv_resize_image_t resize_attr = {0};
ta_cv_resize_t resize = {0};
resize.in_height = srch; // 源图高度
resize.in_width = srcw; // 源图宽度
resize.out_height = dsth; // 目标高度
resize.out_width = dstw; // 目标宽度
// ... 其他参数设置
resize_attr.resize_img_attr = &resize;
ret = ta_cv_image_resize(&resize_attr, image_in, image_out);

4.2.4 NPU 推理

通过 ta_runtime_set_input_pha 设置模型输入数据的物理地址,然后调用 ta_runtime_run_network 触发 NPU 进行一次推理。

taconn_input_phy_t input[2];
// 设置 NV12 格式图像的 Y 和 UV 分量的物理地址和大小
input[0].physical_table[0] = phyaddr;
input[0].size_table[0] = srcw * srch;
input[1].physical_table[0] = phyaddr + srcw * srch;
input[1].size_table[0] = srcw * srch / 2;

// 设置输入并运行推理
ret = ta_runtime_set_input_pha(&m_nnrt_context, m_input_num, input);
ret = ta_runtime_run_network(&m_nnrt_context);

4.2.5 后处理

对 NPU 输出的原始数据进行解析,获取目标的类别、置信度和坐标,并进行坐标转换。

objects[i] = proposals[picked[i]];
// 获取检测目标的原始坐标
float x0 = objects[i].box.left;
float y0 = objects[i].box.top;
// ...
// 对坐标进行缩放和边界处理
x0 = std::max(std::min(x0, (float)letterbox_cols), 0.f);
y0 = std::max(std::min(y0, (float)letterbox_rows), 0.f);
// ...
// 更新检测目标的最终坐标
objects[i].box.left = x0;
// objects[i].class_id; // 获取检测类别
// objects[i].prob; // 获取置信度

4.2.6 硬件编码

将带有标注框的图像使用 libenc24 库进行硬件 JPEG 编码,准备用于推流。

jpeg_config_t config;
config.input_phys_addr = m_encode_phys_addr_in; // 输入物理地址
config.output_phys_addr = m_encode_phys_addr_out; // 输出物理地址
config.width = DST_IMG_WIDTH; // 目标宽度
config.height = DST_IMG_HEIGHT; // 目标高度
// ... 其他参数设置
int ret = jpeg_encoder_encode(&m_jpeg_handle, &config);

TACO SDK 的主要模块详情请查阅 「TacoAI 应用开发技术手册」 中的相关内容。